You've had loads of good advice already, but I just want to add: be sure that you aren't offering choices or compromises mainly in response to conflict. The time that's effective (and for us it was key, I think - he needed to know that his opinions counted) was when he was being sweet! We'd have discussions about whether it would be best to do X or Y - I tried usually to make it his opinion that counted, but also not to set it up as an artificial situation, iyswim. I felt it was a good thing to be less rather than more flexible when he was being uncooperative, so that it was clear he'd catch more flies with honey! But also, I tried to make extra time for reconnection on bad days; a long cuddle often helped a [b]lot[/b].
Hang in there!
I think sometimes in the midst of this it is easy to forget that they are still so little and to forget how far a cuddle can go. I do believe that the desire to behave for us stems from the strength of the attachment. I feel for you, because I have one where Dude's approach was effective. And I have one where it is not...and time-outs just also do not work for some kids. (I didn't believe that until the arrival of my youngest)
Try the book Transforming the Difficult Child.