I would definitely use a shader.  You can render the screen to a texture every frame, then simply draw the texture offset by one texel in the shader.  The new data can just be added on.  You could use FBOs for even greater speed, although you'd need ping-ponging. 

You could also simply draw the texture offset by one, which I think is what you're doing.  It's probably better to use glCopyTexSubImage2D or something. 

What sort of speed do you need?  All of these should run at least as fast as the refresh rate . . .