Nice post indeed, Mher!
I have studied your code a while and I have some comments.
Sorry if I misunderstood your code but here it goes...
As I ran your code I suspected the H2H calculation was not according the description you've provided.
H2H calculations should only take into account the previous games as one should expected and you said as well.
Your code gives us an single H2H value for every two teams confrontation.
That means H2H would be a wonderful predictor indeed since it contains information about all future confrontations of any two teams!
For a single game H2H calculation didn't take the date as a reference.
So the calculation takes all team1 against team2 and team2 against team1 games...
66% accuracy for classifier drops to something around 57%, as I have made the following changes:
headToHeadTotal[t1_, t2_, dt_] :=
N[Mean[
Join[
Normal@
outcomeAdded[
Select[#Team1 == t1 && #Team2 == t2 && #MatchDate < dt &],
"Outcome"], -Normal@
outcomeAdded[
Select[#Team2 == t1 && #Team1 == t2 && #MatchDate < dt &],
"Outcome"]
]
]]
And:
h2hAdded =
outcomeAdded[All,
Append[#,
"H2H" -> (headToHeadTotal[#Team1, #Team2, #MatchDate])] &];
So the result is:

Would you please confirm my interpretation?
I have not built the predict of outcome yet so I do not have final numbers to show...