I'm not sure what you mean by storing the graphics object of a single layer and applying it. The Graphics object is just an instance of the Graphics class used to paint on the picturebox. The picturebox itself provides it (by its Paint event, or OnPaint override in this case, same thing) and I simply pass it along to the layer, and then to the ImageItems, so they can draw themselves.

What would you want to do in the DrawLoaded method then? It would still have to draw everything, wouldn't it? So how is that any different than the loop above it? You can't magically draw a whole bunch of images in one go.

The point of the Paint event (or OnPaint override) is that the PictureBox (Canvas) decides when it wants to repaint itself (or you can force it by calling Invalidate). When that happens, it is completely cleared, and you have to draw EVERYTHING again manually. You can't choose to leave out one layer because that layer will then not be visible anymore.