Despite doing a great deal of sanding on the end grain, and getting it just as smooth as the rest of the wood, it always soaks up more stain than the rest, and turns out much darker and different. Is there any technique or process I can use that can match the end grain to the rest of the wood?
There are grain fillers which are often used on open grained wood like red oak to make it take a stain more evenly, using this on the end grain of a board should do the same thing.
What you are needing is a way to make the end grain absorb about the same amount (which is much less) as the face. Using finer sandpaper on the ends will help a small bit, but the prepping grain fillers will do much better.
This question is a week and a half old but I'll answer with what helps me.
I put thinned shellac onto the end grain of my projects which does a good job of sealing it. It slows the absorption of stain enough to even up the color.
When I say "thinned" I mean a "one pound cut". This is an arcane measurement of shellac concentration that means one pound of shellac flakes to one gallon of denatured alcohol. I use an iPhone app called "Woodshop Widget" to help me dilute shellac to the proper concentration by adding more alcohol.
There are also products sold that advertise to prevent this sort of problem but I have never used any of them.
End grain absorbs more stain/finish due to the capillary action of the wood fibers. In red oak they act like straws and just suck up a large amount of stain/finish.
Sealing the end grain with various conditioners (glue size, thinned finish) works, but it is difficult to get the liquid on just the end grain, resulting in a blotchy look.
Sand the end grain to 600, and then burnish it with a piece of polished metal. This crushes the "straw" fibers, preventing the capillary action.