filtered PWM would work... but the question is how will you adjust the contrast in software with user controls (buttons, encoder) if you don't see the text on the LCD because of wrong contrast setting ?
every piece of those cheap 16x2 displays from china is different (that's my experience at least), there is no universal contrast setting for them - so you can't use a pre-set value in software.
the best way is a multi-turn trimpot (cheap one from china is more than good enough) and set the contrast for every piece individually.
if you really don't have a trimpot around and you need it for a one-off then try different values of fixed resistors to make the right voltage divider for the contrast, the contrast is not drifting on those LCDs (at least not noticeably) so the fixed divider is ok.