Of course Mary is a bad person. (spoilers)
[[MORE]]
She kills people for money. Her whole life as John knows it is literally a lie, but she lets him go ahead and marry her, and she’s completely prepared to keep right on doing so even when she discovers she’s got a baby on the way and her secrets have already put her family at risk and will continue to do so. (CAM stuck him in the bonfire and Mary knows it.)
If the writing had been more consistent, maybe she wouldn’t have shot Sherlock. But that would have been because the decision didn’t make sense at that moment, not because she didn’t have it in her to shoot her husband’s best friend in cold blood. And I think it bears repeating, she kills people for money.
She’s a terrible person.
Which has nothing to do with her being a really cool character, and it doesn’t especially have a lot to do with her and John loving each other (except that apparently bad people are his type). Terrible people can love people too.
Also, with his action of forgiving her and taking her back without reading the information she gave him, John did a huge thing: he gave her a fresh start. She has a second chance to be a whole new person now, and maybe this time she’ll decide she wants to be a better person.
Although I’m pretty sure she will always be a person who is willing and able to put a bullet between your eyes if you mess with her and hers.