Matrix m;
Group g(m);
g.add( Text::New("def") );
g.add( Image::New() );

Device * device = deviceFactory.getdevice();
Render render( device );
render->Shell( &g );
render->Shell( Text::New("abc") );

//-----

Render::Shell( IShape* item )
{
device->Shell( item );
}

Render::Shell( IGroup* g )
{
device->push_context( g.context() );
foreach(device->Shell( i ));
device->pop_context();
}

まあ擬似コードだけどな。
Groupをレンダラの内部クラスにする理由がちょっとわからんな。
ブリッジでデバイスと切り離しておけば、レンダラに必要なのはShell(IShape)とShell(IGroup)だけ。
新しいShapeを追加するときはIShapeを継承させて、デバイスにそのクラスのメソッドを追加すればいいんで
レンダラには手を加える必要がない。