D.K.
Being more playful may help. When my son was in the no's I would turn it around in a silly way. So he would say - no, no, no - I don't want to go to bed. 'What did you say? you said, no you don't want to stay in your clothes? did you say, no you don't want to stay awake? no, you don't want stories? I found the best approach to 'oppositional' behavior was to be on the same side as often as possible.
It also helped my son to sympathize with him. 'I know you don't want to stop playing, you are having so much fun. Now it is time for pajamas and then we get to have storytime'. Showing him you understand his feelings doesn't change that it will still be pajama time, but it may help him feel better about it.
I think your approach of giving choices, but limited ones is spot on. If he wants to get into pjs himself and you are ok with that that is great. It may help to get him a timer so he can see how much time he has to do that. It may also help to give him time warnings. It is fair to let him know that when pajamas take too long there is less time left for play or stories.
I personally did NOT let my son play after he was in pajamas. Only because I tried to use pajamas as a cue that it was time to settle down and get ready for sleep.
My son also went through a stage of staying awake until 9 or 10 pm before falling asleep. I think he was about the same age. He was definitely napping though (at least 2 hours a day). Since most of the time he was laying in his crib happily talking to his stuffed animal buddies, we just let it go. Eventually he just started falling asleep faster. I do not think it was anything we did, just him getting older. I would let your son nap for as long as he wants/needs to.
It sounds like you are more in the positive discipline mind set than the back to basics one. It also sounds like you are using some good tools but they just need a little tweaking to make this age fun for both of you.
And also everything Laurie A said.