For starters, you as a programmer need not worry about it. The specific implementation details are not as important, only how the code is executed is important.
In fact, to all appearances, (non-virtual) methods are created separately from objects, at compile time, and the ability of a class to call a method by name is determined only by the visibility tables of the compiler. In this case, the base class class tables are included by the compiler in the visibility tables of the derived class (in order to ensure the implementation of the standard).
By virtual methods, the picture is slightly different. When compiling a call to a virtual method, the compiler does not know which method will actually be called, so an additional level of indirection is introduced: a table of virtual methods. Each virtual method corresponds to an index in the table, and the real table depends on the actual type of the object (one per type), and is bound to the object during the execution of the constructor.
With data, everything is different: data inheritance means that the object instance requires memory for both its fields and ancestor class fields when created. This size, of course, is a constant for each given class, and is determined at compile time.
All this is basically just an example of a possible implementation. Since the standard does not require a specific implementation of inheritance, this implementation can be any. For example, it is theoretically possible to “attach” methods to an object by name in runtime (like ExpandoObject does).