If you're using D3D there's no need for shaders to implement this. Just create your extra large render target, render your scene to that, and at the end of the frame call StretchRect() to do the resizing of the big render target to the back buffer.
Depending on where the aliasing is coming from, this may not look any better than MSAA, and MSAA is much quicker because it only runs the pixel shader once for each output pixel, and not eight times.
Note that even when using the fixed function pipeline any modern card will convert those settings into pixel shaders in the driver.
You should also make sure you're using the right texture filter settings, and that your textures have mip maps, as both of those are cheap to fix and can cause some nasty aliasing if they aren't right.