Qhimm: The real problem with pixel shaders suddenly occurred to me today. In order to run a pixel shader "later", ie. when you were actually rendering the transparent pixels, you'd need to save the full shader state with each entry in your linked list. In GL fragment programs - fairly closely mapped to pixel shader hardware - there's a set of global parameters shaders can access, as well as each individual shader having a set of local parameters. I think at minimum, there's 24 parameters of each type (although obviously a program might not use all of them), each being a vector of four floats.
Worst case, you're pulling along 1.5KB of data with each pixel in your linked list, so the shader runs in the same "state" as it would have if you'd rendered it straight away. It needs that state, because the solid pixels from the same batch of polygons (or even from the same polygon) ran through the pixel shader with those parameters.
Of course, not all shaders would use that many parameters. But ... GL state is also accessible to a shader. That includes the current fog parameters, matrices, texturing environment...
In an *absolute* worst case you could be talking 3KB of data per pixel in your linked list. That's a few gigabytes of storage...
Of course, you might store only the attributes the shader used. However, that's still quite a lot - if code analysis shows it reads one element of a matrix, you've really got to pull in the whole matrix - and worse, you've now got to deal with dynamically allocated memory for each linked list entry!
Optimising storage is possible, so a group of pixels point to a common buffer of "shared state", but the more complex you make storing this data, the more complex retrieving it is ... not good for real time rendering. As Cyberman pointed out, the great thing about classical 3d hardware was that a given operation took a fixed amount of a time. Even on early pixel shaders that held true - the first cards to support them, you couldn't abort a shader halfway through; exitting the shader caused all subsequent instructions to run, but the results were discarded, so you didn't update any pixels ... but the shader absolutely always took the same amount of time to run, making synchronisation, parallelisation (and other long words) easy to do
Of course, the whole problem is easily avoided by not using pixel shaders ... but that's not a solution people want to hear nowadays - especially when I hear a lot of OpenGL 2.0 will be defined in terms of shaders even for the basic functionality...
Cyberman: Polygons in OGL can have both sides visible, although the environment (meaning the card nowadays) is quite happy to cull back-facing polygons for you. Well, or front facing, if you want it to ... look up glCullFace (IIRC).
Transparency is a bitch to get working WELL, but basic results should be easy; same with texturing.