One question to begin with: Is it correct that your matrix only shows the chance of winning/loosing of a specific hero against another specific hero but not the ability of certain heroes to partner up that you mentioned in the first paragraph?
Regarding your visualization: I can see why you are not satisfied with the displayed matrix. Nevertheless, I would argue that the chosen concept is the appropriate visualization type for the given data. It’s easy to read, all the data is available at once, and it doesn’t take up a lot of space.
But I do think that there are ways to improve your visualization without changing the type of visualization.
Right now, some parts of your visualization are redundant. Since the chances of winning/loosing do not vary if hero 1 and hero 2 are the other way around, there is no need to display it in both directions. You can visibly see that the visualization is symmetrical (the colors are inversed but still symmetrical). To make it a little easier on the eyes you could discard half of your visualization.
On top of that you could improve your matrix with a different color scheme. You either have the option to choose something that has also a semantic value (like yellow for winning or something) or – and I’d probably chose this one – work with a scale of intensity. As in the higher the intensity, the bigger the chance of winning. As shown in the attached (and randomly picked) example below it is much easier to spot the different intensities than distinct between color gradients.
I hope I could help you at least a little bit,