Question: In your opinion is it common and ethical to do custom software development for a Customer and then add that software to your base product which is available to your other customers?

My take on it is that:

1. It's a contractual issue between you
and the Customer.
2. It's done often (although maybe not 'common').
3. It's similar to the Customer paying to have their pet feature bumped up the development priority queue.

Can anyone point to any well known (or at least public) examples of this?

Answer: 
1. You are right, it should be a contractual obligation over who owns the source code. Many vendors will sell the finished product to the client but keep the source code, others will give the whole thing away (which is S.O.P. with our company)
2. I imagine it gets done, just not sure as far as the scope or depth of the copying.

I can't think of any well-known examples (primarily because business between two companies isn't often publicized), but a personal example is when we developed a much more flexible time-tracking system in one of our client applications and it turned out so well that we implemented it into our own personal time-tracking system (which wasn't that great out the gate).
As an extreme standpoint: if all custom made code could not be used anywhere else anymore then at some point you will not be able to continue your business anymore without violating that rule. 

As the opposite extreme: if all custom made code would end up in a generic product then no customer would provide their specific problems to you anymore.

Of course both standpoints are quite extreme and are not likely to happen to that extent in my opinion.

Personally I would state very clearly to a new customer that in general all (custom) code could be used in other products and projects, unless it is agreed in advance to not do so for specific parts of the code. Then if it is really important to them that certain parts stay behind closed doors they will let you know.