I am a senior developer and I am essentially filling both the roles of a technical project manager and team lead. My perspective to your question is more from the PM side:
In my situation, it was a junior developer who was constantly questioning and challenging the decisions I was making regarding the project.
There were times where we would have heated discussions about features and scope, and ultimately I reached a point where I couldn't handle it anymore. Instead of encouraging him to contribute his ideas, and I began to shut him down before he even started. It became more exhausting and time consuming trying to deal with his desire for me to see things his way that I started questioning whether he was a good fit for the team.
The resolution still hasn't happened, but my junior dev has improved his attitude considerably in the last few weeks.
What I had done was to clearly define his roles and responsibilities, and started treating him less like a buddy and more like the PM to Dev. When he starts to challenge me on something now, I only allow him to go so far and then I say something like, "Its not your responsibility to decide that."
While your situation is quite different, my answer for you is this:
You cannot address any of the technical issues while there are unresolved personal problems.
Sit down and talk with him. Apologize for things that you have said or done that could have been handled better. I know this is hard, but by you breaking the ice it gives your coworker a path to apologize too. (He might not, but at minimum a few bricks in the virtual wall between you will be torn down). Emphasis that you want to work as a team, and you really want the project to succeed just as much as he does.
Once you get that out of the way, you can start to deal with the technical. Here are a few pointers:
- Me AND You, not Me VS You: There should be no losers for the argument, there should only be 2 winners. If you start with the attitude and goal that you both should win, there really is no argument and the project/task will be a success.
- Deal with one issue at a time: say "I would like to meet with you to discuss ____", and then stick to it... don't bring up other issues. If he asks you about other problem areas, just say something like: "I am not prepared to discuss that yet"
- Go for a win: Don't go for the big elephant in the room. Work on the smaller issues and build a pattern that you can work together before you tackle any of the major issues.
- Be prepared: "You asked me to implement the feature this way, and I just want to show you that I came up with costing estimates and it will probably take XXX hours to implement. Now I do have a few other ideas that could achieve the goal, but might be easier and less costly to implement."
- Listen to him: If you are only focusing on what you are going to say next, or playing with your phone... it will be obvious to him that you are not listening. Imagine that both of you are standing on opposite banks of a river, and there is an object which you have never seen before floating in the air between you. You can never see his side because you cannot cross the river, so you have your perspective and he has his. But you can listen to him describe what he sees; and you can also study the object by walking up and down stream to get a different view from your side. There is nothing wrong with having a difference of opinion, but by listening you can start to appreciate his point of view.
- Take Breaks: in your meetings, if something hasn't been resolved and things are getting heated... ask to take a break. Pressing on when one of you is upset will only make things worse.
- Don't focus on the negative: If you focus on the million reasons why his idea will not work, he will feel undermined and worthless. If you start out by praising the things you like about his idea, he will be more receptive to compromise. Instead of saying things like "I will not work because...", change it into a question... "Yeah, I think that might be able to work, but what about ____?"
- Accept that you may not have all of the information: There may be things that the PM knows that cannot explain to you. Reasons could range from confidentiality to a lack of understanding on his part (and that gets into shame). At some point, you do have to accept his decision.
- Forgiveness: There is a saying: Unforgiveness is a poison that YOU swallow and hope the other person dies from it. My wife used to bring up stuff from 15 years ago; but a marriage seminar we went to said to let past hurts expire. If something happened that hurt you more than 30 days ago, try to let it go.