YY I think it is a tricky age psychologically when they still don't sleep - actually thinking back I had a bit of a crisis when both DS1 and DS2 were that age because of it. It seems like everyone else has found a groove, either sleeping through or co-sleeping and happy with it and if you're not then it's torture.
The lengthy bedtimes as well, argh. You're not shit for getting frustrated and shouting. I think every parent has done that. It's really not a big deal. Of course it's not the ideal way to handle things, but that doesn't matter - you don't need to be ideal all of the time. As long as you are doing well most (ie, more than half) of the time, then you're doing fantastically! That is what research shows is the important thing in attachment and building resilience and happiness in children - what you are like on average most of the time. Give yourself a break for not being perfect.
Does he still nap twice a day? You might try changing to a single nap late morning or early lunch/after lunch, that ought to mean that he is more tired at bedtime and falling asleep more quickly. Also, don't sit in the bedroom for an hour+ trying to get him to sleep. If he's not sleepy within 15 minutes then come out and try again in an hour's time. What we did differently with DS3 was if he doesn't fall asleep quickly, DH comes in and we both sit there and play with him a bit then we say goodnight and I try to get him down again. This is much less frustrating and lonely for me.
I agree that part time co-sleeping is a bit of a pain. I moved DS2 to his own room at 12m but he would come in part way through the night like this. I didn't actually get serious about keeping him in his own bed until he was over 2. Once I made the rule for myself, it did work, I just had to be more consistent with it. However, I would not do a whole year+ of ANY walking between rooms at night again, and I haven't with DS3. I moved him about a month ago but this is with the goal of doing the more consistent process I did with DS2. For this I gave myself a kind of "watershed" so I'd try and resettle him in his room until midnight, then shifted it to 1am, then 1:30, then 2am etc until I got to 4am. If he was waking more frequently than 1 hour, or I had 2x failed attempts to put him down, then I'd bring him in anyway. I had originally thought that moving him to his room might magically make him sleep, alas it did not! So if I had any more babies (I won't) I wouldn't move them until I was ready to try and night wean, which is what I'm doing this time.
At the same time, I introduced a delay before feeding. Originally, when he cried at night I would rush into the bedroom and almost feel panicked like I had to fix it immediately, so what I changed was that first, I'd think well, OK I might be stuck in there for a while, so I'll go for a wee first. I found that sometimes, by the time I'd had a wee, he'd actually gone back to sleep. I think he would have a dream and the dream would have moved on to a nicer place, or sometimes he'd have a little gas bubble and he'd fart and then feel better, so he didn't actually need me to do anything at those times. Once I got my head around this, then I was able to lie in bed just for 30 seconds or so to think OK, is this just a dream sound, is it just a gas bubble, no, he does need me, OK, still do a wee first - he still does need me, OK. And then when I got into the room, I didn't rush to him. I looked at my watch to check the time and I stretched out walking to the cot, reassuring him, picking him up and walking to the chair and opening my clothing. I didn't add any new soothing tactics like ssssh or stroking him in the cot because this always just made him annoyed. I just did everything that I would normally do, but slowly. I stretched it all out until it took 5 minutes, then I let him latch on. You can start with a lesser delay if you want to. Try 3 minutes. Try 2 minutes.
This did two things. First, he could see that I was there, he was comforted by me being there, he could tell that the milk was coming. Second, I learned that there was no emergency if I did not respond instantly, and that there was a way for me to comfort him that did not involve instantly breastfeeding. Yes, he was still crying while waiting. But he was not ramping up, like he (and DS1) always had if I tried to introduce any other way of soothing, if DH had gone in, if I tried to just stand there and not interact, if I did not enter the room, all of this had always made me feel horribly guilty. I also always had this very anxious, over-empathetic response to them crying. It's normal. It's healthy. We are supposed to react to them crying, that's how they would have survived in caveman times. I don't know why specifically this tip helped me but it helped me enormously, it helped me to feel in control.
Now I was supposed to increase the delay as I (and he) got used to it up to a maximum of 20 minutes, hence timing it to begin with. But I found that I never actually needed to time it. I naturally did not immediately offer milk unless he started to become more upset and as soon as he started falling asleep before I fed him and he didn't get taken into our room he just stopped waking up. It wasn't that fast, but it was much faster and more effective than I was expecting.