I think we make a mistake when we ask our children to emulate behaviors because "it's right" or to have feelings before they are developmentally ready for it. For example, my nephew is trying to get his 2.5 year old to understand that Behavior X "gets Daddy very upset". But a 2.5 year old does not understand "upset" in someone else, and doesn't care. That's why I don't think it even makes sense for little kids to have to apologize - because they think it makes everything all better, like a "do-over".
I think that "reasoning" with a 3.5 year old is next to impossible - she has not reached the age of reason. And she may not be at the age where she can enjoy a structured class, like dance. Even if she enjoys it, once you throw off the balance by having the parents show up to dance, it's just confusing because it's not the same as what she has experienced up to this point.
So you aren't failing her. You have to stop beating up on yourself. You just have to back off and assess where she is at developmentally. All she really understands right now is what you allow, and what is fun for her vs. not fun. So if she talks back, hits, screams, has a tantrum, and so on - you separate her from you. You don't engage in a big long discussion about why that's "not nice" or how it makes you feel - because she's not "there" yet. You remove her from the situation, pure and simple. She gets put in her room or removed from the play date or whatever. You make a simple statement like "No hitting" or "no screaming", but not a big narrative on why it's annoying or insulting or hurtful. If you are incredibly consistent, and willing to endure inconvenience, she will learn what is allowed and what is not. She will learn, and pretty quickly too, that a tantrum or hitting puts her by herself. You disengage from her, you don't participate in the tantrum by trying to get her to stop. You deprive of her the attention she wants, the audience, or the human punching bag.
I don't find that a "time out" chair works well, because you have to engage with them to keep them in it. We just always put my son in his room. If it got ugly or repetitive, we took out certain toys (but always left comfort items like stuffed animals or his special blanket). If we were out, we left the location - the park, a play date, a restaurant, a store. It's often inconvenient, but it's extremely effective. Nothing's worse for a kid that getting stuck in the car seat and leaving the fun activity. If he was fussing to have me buy donuts or a toy when we were out to do errands, he got a warning, and if that didn't work, we left. On more than one occasion, I left a shopping cart half full of stuff! But it worked! (If I was in a supermarket, I told a manager I had to deal with a tantrum, and I was leaving my cart over here, and was that okay, that I'd be back in 10 minutes.) Then out my kid went, into the carseat, no talking from me once he was there. He was restrained, and bored. If I could (if weather was decent), I put him in and stood outside the car, sort of where he could see me so he wasn't afraid but far enough that I couldn't hear his tantrum. It's incredibly effective. If I wasn't in a store, I took him all the way home. If a store, then I would try to go back and finish the errand - if not, I called the manager and said I wasn't coming back and I was so sorry, and alerted them to please put away the perishables. It didn't happen often, I can tell you that.
You have to separate what MUST happen (her behavior must change) from what you would LIKE to have happen (that she would understand it all, be compassionate, etc.). So you go for the first, and wait for the 2nd to happen when she is older.
Once a kid sees that you mean business - and if you have a key phrase you use, that helps - then they straighten up. But don't quit, don't give in. Use the same phrase - count to 3 or say "if you keep screaming, we are leaving" or "You will go to your room until you can talk to me without hitting/screaming." Then do it, and go breathe for 10 minutes.
Good luck!