Julian Schieber scored the only goal of the game in the 57th minute for the German champions, who finished the group with 14 points, while City finished bottom.
Having already been eliminated from the Champions League knock-out stage, City had a chance to take third place and qualify for the Europa League Round of 32.
But it was the first time that an English side finished a Champions League group stage with just three points and without a victory.
Ajax lost 4-1 at Real Madrid but qualify for the Europa League with four points.
While Dortmund can continue to dream about another Champions League title to go with their crown from 1997, City are left to concentrate on defending their Premier League title - with the Manchester derby against leaders United coming up this weekend.
Dortmund coach Jurgen Klopp made six changes to his line-up compared to the team's weekend draw at Bundesliga leaders Bayern Munich with Oliver Kirch and Felipe Santana replacing Lukasz Piszczek and Neven Subotic in the backline; as well as Moritz Leitner, Kevin Grosskreutz, Ivan Perisic and Schieber coming on for Jakub Blaszczykowski, Sven Bender, Mario Goetze and Robert Lewandowski.
City swapped three players as Matija Nastasic, Scott Sinclair and Javi Garcia were on for Aleksandar Kolarov, David Silva and Yaya Toure.
Both teams took their time getting into the game. Dortmund, who were playing for the first time with that line-up, had the first chance after 12 minutes but Kirch's attempt was saved by City keeper Joe Hart.
City forward Edin Dzeko put in one of the rare energetic performances from a City player first putting in a dangerous cross, which Marcel Schmelzer cleared in front of Carlos Tevez in the 24th minute and then he shot from about 30 yards nine minutes later which Dortmund keeper Roman Weidenfeller fended away.
Dortmund did not rest on their laurels and tested Hart again in the 36th minute as the keeper got his hand on Marco Reus's shot and deflected it off the outside of the right post.
And Hart was again forced into a save on Perisic's long attempt a minute before the break.
Dortmund came out of the changing room looking to take the lead but watched as Hart saved a fine volley by Perisic in the 53rd minute and Grosskreutz's low strike a minute later.
And the hosts finally grabbed the lead in the 57th minute as Blaszczykowski raced down the right side and crossed into the box where Schieber slid in to poke the ball past Hart.
Tevez was unable to beat the in-form Weidenfeller with a strike in the 67th minute for City's best chance.
Dortmund continued to play their game and Hart made another great save with seven minutes remaining, this time stopping Lewandowski with a point-blank save.