You can't read and write the same image at the same time, so yes you can't do it without at least two images.
But you don't need to copy the image every time, you can use a kind of double-buffering:
RenderImage image1 = new RenderImage(...);
RenderImage image2 = new RenderImage(...);
RenderImage front = image1;
RenderImage back = image2;
...
foreach (Shader shader in globalShaders)
{
// draw "back" into "front"
front.Clear();
front.Draw(new Sprite(back.Image), shader);
front.Display();
// swap front and back buffers
RenderImage temp = front;
front = back;
back = temp;
}
// the final result is in the variable "back"