How to use a secret to allow the generation of public keys, where the private keys can be calculated later
To expand on Ricky's comment, assuming Alice and Bob are the only participants, they can use an identity-based encryption scheme where Alice also acts as the trusted third-party ("Private Key Generator" in the Wikipedia article). Namely:


Alice puts on her PKG hat, and generates the public parameters of the system and a secret which will be used later.
Alice removes her PKG hat, she broadcats the public parameters and says: anybody who wishes to send me messages, just use any string you want as your public key and send it to me along with your ciphertexts.
All the Bobs of the world encrypt messages using their chosen public keys and send the ciphertexts and the public keys to Alice.
When Alice wants to decrypt a message, she puts on her PKG hat and obtains the private key associated with the public key which was used to encrypt the message.
Alice removes her PKG hat and uses the private key to decrypt the message. Optionally, she may store the private key so that she does not have to do step 4 again if she receives another message encrypted with the same public key.


The only requirement is that when Alice wants to decrypt a message, she must know which public key it was encrypted with. There is no requirement on the public keys themselves, including how or by whom they are generated. In any case, Alice is the only one who can decrypt since she is the only one who knows the secret. Matching a specific Bob to a specific public key seems to make it more or less equivalent to a regular cryptosystem.