9 years and still counting, in the case of DS. He's still the pickiest eater going, and the only thing that stopped me condemning myself as a terrible mother was having DD who is a normal eater.
So hang on to the thought that it's not a reflection on you - they're bringing their own personalities to the table.
On a practical note: you could try lacing a suitable food with lactulose, so the constipation, once initially sorted, doesn't return ( one less thing to worry about! But you might want to check with doctor/HV first).
And find a multivitamin he'll eat to make up for the unbalanced diet.
Then it's the long haul of introducing new foods. Might it be a problem with texture? Try smooth things - even if not brilliantly healthy just to get something different into his mouth - custard? Soups? Baked beans? Hummus? Soft pasta? And give bread in different forms - slices, rolls, brown, white, breadsticks, rice cakes
Eat with him - so he sees consumption. Don't let him fill up on milk. Don't have show downs, elaboate routines or whatever and feed only at mealtimes. Leave any plates if initially rejected food on table for about 30 mins ( permitted "go back" time, then clear and nothing more until next feeding time.
Do everyting you can to seem unfussed - vent here notat him.
Good luck!