Instead of making copies of the frame and moving it, you can just get the same effect if you the the color of the current pixel, all the colors of the surrounding pixels and divide it by the number of pixels you used. Let me make a simple example. Let us say you are looking for the new color of pixel at (3, 5). You would take the color itself and the surrounding pixels on (2, 4), (3, 4), (4, 4), (2, 5), (4, 5), (2, 6), (3, 6), (4, 6) and sum all those. After that you divide by the number of pixels, in this case 9. You pixel shader makes this for every pixel and by that you get a blurred image. You could take only some neighbouring pixels, or the next outer neighbours, or just the ones on one side. That depends on the effect that you want to get. If you want, you can even take other pixels, not the ones which are direct neighbours but pixels which are further apart of your current pixel. With this solution, you can mimic the effect of making some copies and moving them around.
I made a simple example using shader toy:
this method is a simplification of the gaussian blur. You can read that up if you want to extend it. It is really simple. Basically, you calculate a weighted sum of the neighbours colors. In most cases, you want the weight to scale with the distance from your center. Maybe just read the wikipedia article i linked.
If you have any questions, feel free to ask.
edit: i extended my example. blur1 takes the direct neighbours. blur2 takes the direct neighbours and those direct neighbours and blur_with_size takes the number of 'neighbour levels' as parameter. The bigger it is the blurrier it gets.