TypeConverter を継承して、好き勝手な property を登録するという方法でやてみました。
その結果、TypeConverter を継承した MyPropConverter をつくり、

[TypeConverter(typeof(MyPropConverter))]
class Hoge{}

という空っぽの Hoge クラスのインスタンスを PropertyGrid.SelectedObject に指定することにより、
好きなだけ任意のプロパティ項目を表示できるようになりました。しかし...

たとえば
オブジェクトAを選択すると、設定テキストAの内容をつかってプロパティを表示、
オブジェクトBを選択すると、設定テキストBの内容をつかってプロパティを表示、
オブジェクトCを選択すると ... するというようにしたいのですが、
すると、いま選択されているのが AなのかBなのか、なんなのかを MyPropConverterが知る必要があります。
(オブジェクトの種類によって GetProperties の戻り値を帰る必要があるため)
これはどのように指定すれば良いのでしょう?

理想をいえば、MyTypeConverter のコンストラクタでそのまま設定テキストを渡して解析させ、
結果に応じて GetProperties の戻り値をかえたいです。しかしそのようにすると、

propertyGrid.SelectedIndex = new Hoge(); の行で実行時エラーになります。問題はそもそも
MyPropConverterのコンストラクタの呼び出し元はどこなのか?ということですが....