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: 
From an ethical standpoint, I think it's actually quite simple: It's a matter of what your customer perceives you to be doing. Do they think you are customizing your product for them, or do they think they are paying for their pet requests to be bumped up in your feature queue?
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.