The world number one triumphed 7-6 (7/3), 7-5, 7-5 in a tense semi-final in which he crucially saved 10 of 11 break points.
Shapovalov was so distraught that he left Centre Court in tears.
In his seventh Wimbledon final, Djokovic will face Matteo Berrettini after the world number nine became the first Italian to reach a Wimbledon singles final by beating Hubert Hurkacz 6-3, 6-0, 6-7 (3/7), 6-4.
"I don't think the scoreline says enough about the performance or the match. He (Shapovalov) was serving for the first set and was probably the better player," said Djokovic.
"I would like to give him a big round of applause for everything he has done today and also this two weeks. We are going to see a lot of him in the future, he is a great player."
Victory on Sunday will not only take Djokovic level with Roger Federer and Rafael Nadal on 20 Slam wins.
He will also just need the US Open to become only the third man in history, and first since 1969, to complete the calendar Grand Slam.
"I am trying to make the maximum of my own abilities each match and see what happens," said 34-year-old Djokovic.
"At this stage of my career, Grand Slams are everything and I have been very privileged to make history in the sport I truly love."
Shapovalov showed no signs of nerves despite appearing in his first Slam semi-final and having come into the match with a 0-6 losing record against the world number one.
He broke for 2-1 but Djokovic, in his 10th Wimbledon semi-final and 41st at the majors, was back on terms in the 10th game before taking the tiebreak when the Canadian double-faulted.
Shapovalov then failed to take five break points in the second set and Djokovic pounced.
He broke for 6-5 on another double fault and pocketed the set before the Canadian took out his frustration on the chair umpire describing the official as "a joke".
Djokovic showed his trademark steely defence to fend off four more break points in the second game of the third set.
Again, he made the Canadian left-hander pay by breaking for 6-5 and serving out the match in the next game.
On Sunday, Berrettini will attempt to become Italy's first men's Grand Slam champion since Adriano Panatta at the 1976 French Open.
- 'I deserved it' -
"I think I never dreamed about this because it was too much for a dream," said Berrettini.
"I am trying to be the best at everything but after the third set I was feeling I deserved to win it but lost it.
"I said 'it doesn't matter', I was feeling the stronger player and that's what I said to myself and eventually it paid off."
Should he win the final, Berrettini may be able to celebrate a national double with Italy facing England in the Euro 2020 final in London later that day.
"So far it is the best tennis day of my life but hopefully Sunday will be even better. I feel kind of chills but I am doing it, so I have to believe it."
Berrettini, having wasted three break points earlier in the first set, eventually broke through in the seventh game, backing it up in the ninth, converting set point courtesy of an ugly forehand shank from the Pole.
The 25-year-old then raced through the second set in just 23 minutes, a Hurkacz double fault and a wrong-footing forehand allowing Berrettini to seal a 10th successive game.
That became 11 games in a row at the start of the third set before 18th-ranked Hurkacz, bidding to be the first Polish man to make a Slam final, stopped the rot.
Hurkacz held on and swept the third set tiebreaker but his momentum was quickly halted as the Italian broke for 1-0 in the fourth.
Berrettini was unable to convert a match point in the ninth game but made no mistake on his own service.
The Italian fired 22 aces, taking his tournament total past the 100-mark, and 60 winners.
He only faced two break points, both of which he saved.
"Matteo played pretty great. He served bombs. He really didn't do many mistakes throughout the whole four sets," said Hurkacz who had knocked out Federer in the quarter-finals.