Long time ago, I made an application near to your requirements. The main design was:
An abstract base Shape class having some methods like a void Render(Graphics) and a method for hit testing,bool HitTest(Point).
Shape classes for custom shapes that are needed on each layer; shapes like point, line, icon, path, etc that inherit from abstract Shape class.
Each derived shape has its own properties and overrides Render method and renders itself on the graphics object; also overrides HitTest method to check if it contains a point.
A Layer class that contains a List of Shapes and a void Render(Graphics) and calls render method of each shape. (You can restrict each layer to specific types of shapes, you can implement z-order management for shapes, etc)
A Map class having and Image and a List<Shapes> and Save and Load to/from file. (You can handle Active layer and active shape easily.)
A custom control that has a Map property. This control is responsible for rendering layers and handling user mouse interaction and update layers. This control overrides OnPaint and mouse events and enables double buffering.
Hope this idea helps you.