You could try doing truecasing first.
(There are various libs for that. You will probably need to add a few domain-specific fixes for your data too. And you should try smashing all case before truecasing. It's not a completely solved problem either.)
As a general rule, breaking the problem down is the best approach. Most of the components perform poorly when they are expected to do spelling correction and transliteration and truecasing and fix punctuation and ... Named-entity recognition is no exception.
There are examples where the caseless version is ambiguous.
He helped Jack off the horse.
How you tune it and set the threshold will depend on your application. (Do you prefer false positives to false negatives?) Ideally the truecaser gives you a probability or other indication of ambiguity, but to do it perfectly requires full AI.