Mick,
This is kind of what I have done.
I have a base class called Entity, that has a virtual method Draw(). There is also an EntityList class that also has a method called Draw(), that calls the Draw() method on each item in the collection. My thought was that new graphics should derive from the Entity class which can be added to the EntityList or drawn on its own
Here is where things get funky, since I have inverted the Y axis to move the origin to the lower left, some objects dont behave well. For example text, I have to reset the matrix before the text is drawn or it will be inverted. I made a class called DrawSpace. Its my idea that this class hold the matrix/space information, incase an Entity needs to temporarily alter the matrix or the origin.
private void panel1_Paint(object sender, PaintEventArgs e)
{
DrawSpace drawSpace = new DrawSpace(panel1, e.Graphics);
Pen pen = new Pen(Color.PapayaWhip);
EntityList eList = new EntityList();
eList.Add(new Circle(drawSpace, new PointF(100, 100), 30, pen));
eList.Add(new Line(drawSpace, new PointF(100, 100), new PointF(100, 200), pen));
eList.Add(new Circle(drawSpace, drawSpace.LLPoint, 30, pen));
eList.Add(new Arc(drawSpace, drawSpace.CenterPoint, 45, 0, 180, pen));
eList.Draw();
}