Giorgio Chiellini put Juve ahead and Giacomo Bonaventura equalised, both in the first half, as a free-flowing match finished 1-1 after extra-time.
Gianluca Lapadula’s first penalty for Milan was saved by Gianluigi Buffon.
Mario Mandzukic then fired a Juve effort against the crossbar before Donnarumma produced a superb one-handed save to stop their fifth attempt from Dybala.
That left Mario Pasalic to convert the winner with ease.
Donnarumma, already a Milan regular, had kept Juve at bay in the previous 120 minutes while Dybala could have won the game at the end of extra-time but sent a wild effort sailing over the bar.
The match is traditionally played between the Serie A and Italian Cup winners. Juve won both last term so Milan qualified as cup runners-up.
Donnarumma made early saves from Stefano Sturaro and Mandzukic before Chiellini turned the ball in from a corner in the 18th minute.
Milan, who beat Juve 1-0 in their last Serie A meeting, levelled when Bonaventura scored with a glancing header from Spaniard Suso’s cross seven minutes before halftime.
Donnarumma made another outstanding save in the second half to turn Sami Khedira’s long-range effort over the bar.
Opposite number Buffon, 21 years his senior, was not to be outdone, brilliantly turning Carlos Bacca’s header on to the woodwork.