Sergio Aguero looked to have won the match for the Premier League club in the 79th minute, but Christian Pulisic equalised in the sixth minute of stoppage time to force penalties to decide the outcome of the contest.
Raheem Sterling missed Man City's seventh spot kick to hand the advantage to Dortmund, but Jacob Larsen and Mikel Merino were then both denied by substitute goalkeeper Angus Gunn as Pep Guardiola's side secured the win.
A more experienced XI took to the field for Man City, with Nicolas Otamendi, Fabian Delph and Gael Clichy among those returning to a squad that lost their first pre-season game to Bayern Munich on July 20. As for Dortmund, head coach Thomas Tuchel made six changes to the team that beat Manchester United last time out.
A lively opening five minutes saw both teams have shooting opportunities, but Kelechi Iheanacho fired wide of the post for the Citizens, before Ousmane Dembele had a rasping strike blocked by Nicolas Otamendi after a Willy Caballero mistake.
A loose kick from Caballero then presented Emre Mor with a shooting chance, but the young Turk curled his effort wide of the post, before Delph missed the target down the other end after a smart cross from Jesus Navas, all inside 10 minutes.
Careless defending from Man City allowed Dortmund another shooting chance in the 18th minute, but Dembele missed the target from outside the box as it remained goalless after an entertaining opening to the pre-season clash in Shenzhen.
The next opportunity of note came for Dortmund in the 35th minute when Mor drove away from the Man City midfield before setting up Marcel Schmelzer, who returned the favour, but the youngster fired straight at Caballero.
Iheanacho then had a super chance for Man City in first-half stoppage time after the ball fell for the young striker some five yards from goal, but Dortmund goalkeeper Roman Burki was on hand to make the save.
Both managers made sweeping changes at the interval and among those entering the field for Man City were Aguero, David Silva and Yaya Toure as Guardiola brought on his big-hitters for the second 45 minutes.
Neither team created a chance of note in the opening 15 minutes of the second half, however, with the raft of substitutions seemingly harming the tempo from the first period, which created an entertaining and open contest.
Wilfried Bony had the first shot on target in the second period just past the hour, but the Ivory Coast international, who has been linked with a move away from the Etihad, could only find the palms of Burki.
Bony again came close in the 67th minute after turning away from two Dortmund defenders and looking for the top corner, but the striker's effort missed the crossbar as it remained goalless entering the final 20 minutes of action.
The best chance of the match fell to Dortmund 15 minutes from time when Gonzalo Castro broke through into a one-on-one with substitute Man City goalkeeper Gunn, but the youngster made a brilliant save.
It was Man City that made the breakthrough in the 79th minute, however, when Aguero tapped home a low cross from Silva to send the English side 1-0 ahead in Shenzhen.
There were also late appearances for Nolito and Sterling as Guardiola had the first proper look at his squad, which could include John Stones and Leroy Sane at the start of the new Premier League season.
Dortmund had not finished though and levelled in the sixth minute of additional time when American teenager Pulisic found a route through the legs of Gunn to force a penalty shootout, which Man City won 6-5 to claim the bragging rights.