I have tried deriving a custom numpunct<> facet from both numpunct<> as well as from numpunct_byname<>. Both give the same results and both approaches work.
The example I tried was to override the do_truename() and do_falsename() virtual methods so as to return their German equivalents "wahr" and "falsch".