This is a really tough one. Part of it, I've read, is that kids' taste sensors are not fully developed, but our son was very small, too, and needed to eat.
I think the first step is to make sure he's coming to table hungry. In our case, that meant putting the brakes on the junk that was around the house. He was storing up on the bad stuff and coming to the table feeling choosy. Getting the junk food out of the house was probably the hardest part!
So it took a lot of vigilance and patience. We insisted on sitting down to a balanced meal at dinnertime. We presented a large variety of foods and expected/required him to eat a very small portion (in the case of the stuff he didn't like). We allowed him "seconds" of the foods he liked, as long as he'd tried a small portion of everything on the plate.
When he adopted a new food (at first he would eat nothing green), we kept track of it on a white board. When I say "adopted," I mean he would not need to be prodded to eat it; he ate it without much/any resistance. At a certain point (2 new foods? 3?) we rewarded him with a toy, a book, something small, but his choice. We kept the white board in the kitchen, so he could see it as he ate. He began to feel some sense of pride at seeing the list grow, and now at 14? He eats everything: all vegetables, all fish, everything.
Hope you have some success with this.