みんな言ってるけど、Factoryがこれほど似合うパターンは無いな。

Shapeはabstruct classにして、
staticな関数として、
Shape createInstance(StreamReader s)
を作って、各子クラス返えす。
あとは要りそうな関数をabstructで定義しとけば便利じゃないかな。