The Arizona Diamondbacks signed Montero as an undrafted free agent in 2001 for a $13,000 signing bonus.
Montero made his major league debut on September 6, 2006, against the Florida Marlins. In that same game, Aníbal Sánchez of the Marlins would throw a no-hitter against the Diamondbacks. Montero played in a total of six games that year, recording a .250 batting average.
In 2007 and 2008, Montero platooned with Chris Snyder at the catching position for the D-Backs and batted a .224 average with 10 home runs in 2007 and batting .255 with five home runs in 2008.
Montero began the 2009 season slowly, hitting just three home runs and having just a .200 batting average through the first two months. However, when Snyder was put on the disabled list in June, Montero's playing time increased markedly and he finished the season with a career-high .294 batting average.
Montero caught Edwin Jackson's no-hitter on June 25, 2010. He finished the season with a .266 batting average and nine home runs.
In 2011, after hitting .272 with 10 home runs and 45 RBI, Montero was selected to his first All-Star Game. He also threw out 40% of baserunners trying to steal, a career high.
Montero was named to his second All-Star game in July 2014, replacing the injured Yadier Molina for the National League.
Following the 2014 season, the Diamondbacks traded Montero to the Chicago Cubs for minor leaguers Jeferson Mejia and Zack Godley. Before a hand injury in mid-July, Montero had appeared in 73 games for the Cubs with 217 at bats. He had 10 home runs and 32 runs-batted-in with a batting average of .230. On August 30, 2015, Montero caught Jake Arrieta's no-hitter against the Los Angeles Dodgers.
During Game 1 of the 2016 NLCS, Montero hit a pinch-hit grand slam in the 8th inning to break a 3-3 tie and lead the Cubs to a 8-4 victory over the Los Angeles Dodgers. It was the third pinch-hit grand slam in postseason history. Montero entered Game 7 of the 2016 World Series in the bottom of the 9th inning as a defensive replacement for Cubs backup catcher David Ross. In the top of the 10th inning, having batted only .091 (1-for-11) in the postseason to that point, Montero hit a single to left field which drove in Cubs first baseman Anthony Rizzo and improved the team's lead to 8-6. Since the Cleveland Indians only scored one run in the bottom of the 10th inning to make the score 8-7, Montero's RBI provided the game's decisive run and sealed the Cubs' victory. After the series, Montero expressed his disappointment in losing playing time to Willson Contreras and David Ross.
In a game on June 27, 2017, the Washington Nationals went seven-for-seven in stolen bases against Montero. After the game, he said that it was the fault of Arrieta, who took too long to deliver his pitches and failed to hold the runners at their bases. The next day, the Cubs designated Montero for assignment. It was reported this was done because management felt he was a disruption in the clubhouse; Anthony Rizzo considered Montero's comments to the media unprofessional.
On July 3, 2017, Montero was traded to the Toronto Blue Jays for cash considerations or a player to be named later. He was placed on the disabled list with a groin strain on August 4. After a one-game rehab assignment with the Triple-A Buffalo Bisons, Montero was activated on August 16.
Montero is married to Vanessa. Together, in 2017, the couple created the Miguel and Vanessa Montero Foundation, which aims to provide medical assistance to seriously ill children from Venezuela.
Montero grew up in Venezuela, the youngest of three children. He credits his parents with encouraging him to stay positive and always try.