Reflection, in tutto l'ambiente .NET, serve per leggere a posteriori la struttura e i valori di un tipo; nel tuo caso non credo sia necessario.
Più che altro, potresti risolvere il problema con:
2 metodi di inserimento e lettura di valori per le property "estese"
1 o più dictionary interni (1 per ogni tipo di dati ad esempio) che contengono chiavi (nomi delle proprietà) e valori (valori delle proprietà)
Per l'inserimento potresti mettere n overload, uno per tipo di dati (SetExtendedPropertyValue(string, integer) - SetExtendedPropertyValue(string, string) etc). Ogni overload andrà ad inserire nell'apposito dizionario il valore.
Per la lettura potresti usare un metodo generico GetExtendedPropertyValue(Of T)(string) as T, facendo poi una select case sul tipo T per sapere in quale dictionary cercare i valori
Ho buttato lì giusto due idee, eventualmente approfondiscile tu!
HTH, tK