I've been this player.
It's not that I want to hog the limelight. It's just that the character customization minigame is one of my favorite parts of 3.5, and when I'm splatbook-diving for cool, obscure options and the other players aren't...you get the problem you're describing.
Here are a few strategies (some for the DM, some for the problem player, some for the group as a whole) that have helped me be less of a pain for my DMs to deal with:
Have him optimize sub-par character archetypes:
Not every character archetype in 3.5 is equally effective. Primary casters are really strong; in-combat healing is pretty crap. One of the ways I've found to get my optimization jollies without overshadowing my party members is to start with an inherently low-power character concept...and then optimize the crap out of it.
Sure, in-combat healing is bad...but what if you found a way to cast Cure X Wounds as an arcane spell so that you could cast it through War Weaver's Eldritch Tapestry class feature, then layer on rider effects from the Imbued Healing feat and the Combat Medic prestige class simultaneously...
If your problem player's motivation isn't that he wants to be exceptionally powerful per se, just that he loves char-op, this might be a way for him to have fun with char-op in a way that doesn't result in overpowered characters.
Have him channel his overpoweredness through the party:
Buffing is extremely strong in 3.5. You can see this in cases of self-buffing (like, e.g., self-buffed Clerics being far better at fighting than Fighters will ever be), but it's equally true when you're buffing others.
If your problem player would enjoy playing a character specialized in buffing the party, it would allow you to crank the encounter difficulty dial up to 11, giving your problem player the challenge he craves, without murdering the rest of the party.
Realistically, the problem player would still be contributing disproportionately to the group's success, but the other players probably won't feel so much like they're being overshadowed when they're the ones delivering the killing blows, even if the real reason their attacks were so effective was the 14d6 sonic damage being added to their attacks by a Words of Creation/Dragonfire Inspiration Bard/Sublime Chord.
Tap your optimizer's skills to bring the rest of the party up to speed:
If there's one thing you can depend on with an char-op nerd, it's that they have way more ideas for character builds than characters they can realistically play. That means your problem player would probably welcome the opportunity to help optimize the other players' characters.
This comes with risks: Not everyone wants optimization help; some people are more invested in their character being theirs than being effective. And even in the cases where the help is welcome, you have to ensure that it's help, not "starting off as help but then actually just building their characters for them."
But those problems are tractable for a DM, and from the sounds of it your problem player is a reasonable guy, hopefully reasonable enough to know not to take over someone else's character so much it no longer feels like theirs. If you attempt this route, have a talk with the whole group beforehand (including the problem player), where you set expectations for how much help is too much, taking everyone's desires into account.
If it works, the best-case outcome is that you now have a whole party of overpowered PCs, at which point you can just start adding 5 to the EL of every encounter and everybody can have fun playing high-op 3.5.
Not everything has to be about changing the makeup of the party. You can also change the makeup of encounters.
You mention that your problem player is good about letting the other PCs have their time to shine. Try taking this a bit farther - design encounters where there are multiple problems to solve, and the ones that play to the rest of the party's strengths are easier than the ones that don't.
Example: The Secret MacGuffin of Doom is in the bowels of the Cursed Temple - but the Demonic Hordes of Graz'Akh-Akha'Zakh-Thul are coming! If they so much as set foot within the Temple, the MacGuffin will be irrevocably corrupted! Someone must hold the threshold while the depths of the Cursed Temple are plumbed, or else all is lost!
At that point, you're free to make the Guardians of the Cursed Temple an appropriate challenge for your normal party members, and make the Demonic Hordes ludicrously over-CRed...your optimizer can take it.
You don't want to do this all the time, since splitting the party is typically a bunch of extra work for you as a DM, but if your problem player is mostly fine with playing nice with the rest of the party, this is a way to throw him a bone every now and then, and let him sink his teeth into a fight hard enough that he can't trivialize it.
Out of game solutions:
If none of that solves the problem, you might have to bite the bullet and restrict what this guy can play. Start off with a conversation about why you're doing it, and tell your player just what you told us: It makes it too hard for you to balance encounters for the party when the characters have such wildly different power levels.
If you go this route, I recommend just straight-up banning things, perhaps along the lines of "no full casters" or "no Tier 1/Tier 2 classes." If you can, avoid spot-nerfing the problem player's favorite tricks, especially after the fact.
The reason I recommend bans instead of nerfs is that my favorite thing about 3.5 char-op is the process of optimizing within a problem space. Being told ahead of time that I can't play certain classes isn't a huge deal; it just means I'm optimizing within a different, smaller problem space than I would be otherwise.
On the other hand, I hate having individual spells banned, being told that my tricks don't work even though they clearly should according to the rules, and having post-creation changes made to my character due to balance concerns. These things make me feel like I was lied to, led to believe that I was playing one game but now it turns out we're playing a different one.