Помню, делал подобное так: генерировал исходный код класса (со всеми необходимыми атрибутами у свойств), затем компилировал и загружал в память (с помощью CSharpCodeProvider), создавал экземпляр объекта (с помощью Reflection) и передавал PropertyGrid'у.