You can take things even farther:
First, one can easily apply your approach to a 50% gray layer in overlay blend mode. This however gives you very little control over the amount of grain added to the various luminosities. You won't get any grain in the highlights for example...
Take DXO's Filmpack: It uses, as described on their website, somehow an intensity function which depends on the luminosity.
To simulate this, I use two curves adjustment layers. One for the light (blue curve), the other for the dark (black curve) grain.
In this example the numbers for the (x,y)-points of the curve are:
Light grain: (0,16), (100,150), (255,240)
Dark grain: (16,0), (150,100), (240,255)
Clearly these two curves annihilate each other (which is mandatory) without layer masks.
One needs some appropriate layer masks. Appropriate means here that the mean luminosity value of the layer mask must be around 127. You can take scanned grain, artificially created etc.
Now just put the grain mask to one and the inverted grain mask to the other curve.
So now you have total control over the responding behavior of your artificially created film; you can add further control points, put the two curves in a layer set and control the strength etc.
All non destructive.
There are several points where this technique can be pushed farther. Add color noise, refine the grain creation with some more complex approaches etc...