Bitemporal Table with changing schema
Im not sure if this answers all of your questions but this sounds very similar to what I do with our data warehouse. However the way i interpret your post you would want to have 1 table with your data, and another with your table definition meta data.

For the data table add a column to flag is_current. (Either an int or bit datatype)
Also have 2 date columns valid_dt_from &amp; valid_dt_to. 

If a row changes you update  the old row is_current = 0, and valid_dt_to =getdate (). 

Insert the new row with is_current =1 and valid_dt_from = getdate (). 

You can do the above with a single merge query. 

To get the current data select * from table where is_current = 1.

Add new columns as they are needed. But don't delete old columns. In theory if you have to reconstruct the table to previous point in time all rows from that time should have null values at that time. 

Create a similar table to define your data table definition. Add a record to show when each field gets added, removed and if it is current.

Your select query could be built dynamically. Where is current =1, or reconstructed as at a point in time.