When you think about good hitting catchers, who comes to mind? For me it's Mike Napoli, Yasmani Grandal, and JT Realmuto. All 3 are or were above average hitters. Napoli eventually moved to 1B/DH due to his poor fielding, but Realmuto and Grandal are among the best fielding catchers in the league.
When I fire up Baseball-Reference and I sort among catchers with at least 300 PA and 45 games at catcher sorted by OPS+, the results surprised me. First of all, there were 30 qualified catchers. Leading the way was Mitch Garver, and it wasn't even close. With an 11.6% HR rate, Garver was the best hitting catcher in the league.
Coming in at number 2 was Willson Contereras. He slashed .272/.355/.533 with 24 HR in 409 PA. That was good for a 125 OPS+, or 25% better than the average hitter. At number 3 was Omar Narvaez, and then at number 4 was Gary Snachez. They each had amazing hitting seasons, and so did the number 5, Yasmani Grandal.
I was surprised when I saw that Grandal was number 5, because he did have 28 HR with a .380 OBP. He did have a wRC+ of 121, which suggests he was a bit better, but there were some good hitting catchers ahead of him. I would argue that he was the best fielding catcher in the MLB because of well, just look at Fangraphs.
JT Realmuto came in at 8th. That's not bad, top 73%. He hit 25 HR, while slashing .275/.328/.493. That's not bad.
Catchers aren't known for hitting the ball. How could one ask them to hit the ball well, there position is the toughest position to play. Catchers aren't concerned about hitting, but rather fielding. That's why catchers aren't good hitters.
Unless of course, you're Mitch Garver.