Primer: Shaders
Part of the confusion is the confusing terminology.  "Shader" is a bad name.  How do you "shade" a vertex? That implies color, when in fact vertex "shading" is really about deforming the position of vertices.  It has nothing to do with color!"Vertex program" is a better term.That brings us to "pixel shader."  That's actually a good name in order for beginners to learn the concept, but it's imprecise.  OpenGL insists on calling it a "fragment program" because with certain forms of antialiasing, there are multiple "fragments" per pixel.  "Program" is also a better name than "shader" because there are things you can do per-pixel other than change the color.  For example you could change the depth written to the Z-buffer, or you could cause the pixel to be skipped based on some criteria, like whether the texture color is pink.Anyway, it's just a tiny program that executes either per-vertex or per-pixel.  For example you could write a vertex program which moves each vertex in a sinewave pattern based on time.  Or you could write a fragment program to change the color of each pixel from red to green and back based on time.Then there are more advanced/recent concepts like a "geometry program," which lets you generate triangles based on vertices or edges.Sometimes I wonder if it's overly complicated, or if the problem domain is just complicated.  It took me years as a kid to finally grok this, but once I learned it, it turned out to be very simple.  Honestly it wasn't until I got up enough courage to sit down with the OpenGL specs and read through them that everything clicked.  They're dry reading but not difficult.