You're making a type system on top of the existing type system. There is very little benefit to strongly-typed properties that cannot be referenced in compiled code. I have seen this approach used before and it ends up being a mess.
Just use a key-value store in a single property called ExtendedProperties or some such.
In other words, you are trying to avoid Dictionary<string, object>, but in that effort you are re-inventing the .Net type system.
Attach a property called ExtendedProperties of type Dictionary<string, object> and be done with it. The limitations of loosely-typed data are less costly than the road you're going down.