Shaw was drafted in the second round by the Buffalo Bills in the 1970 draft. He was the third quarterback on the roster for the team next to Dan Darragh and James Harris. In the first game of the season, he stepped in for Darragh, going 4-for-7 for 52 yards in the 25-10 loss to the Denver Broncos. In the second game, he took over for an ineffective Darragh and went 13-of-18 for 143 yards, although he threw two interceptions in the 19-0 loss to the Los Angeles Rams. He was named the starter for the following game against the New York Jets. He went 12-of-21 for 317 yards with two touchdowns and two interceptions in the 34-31 win, with Shaw's pass to Marlin Briscoe delivering the victory. It was one of only three games where he would throw two touchdowns along with one of only two games with over 300 yards passing. He threw for 10 touchdowns and 20 interceptions on the year, throwing an interception in all but one of the games he started while passing for 2,507 yards and a 65.3 passing rating, with the Bills going 3-10-1 on the season after going 0-6-1 to close the year out. Despite a dismal season, he was sixth in yards, 16th in touchdowns, 7th in completion percentage along with 2nd in interceptions. He was plagued by fumbles, for which he had 10 of in the season along with being sacked 41 times. Shaw was named NFL Offensive Rookie of the Year by the Associated Press in 1970, becoming the first quarterback to ever receive the award (started in 1967).
Shaw started the year off with a 18-of-30 day for 353 yards with four touchdowns and three interceptions in a 49-37 loss to the Dallas Cowboys. The rest of the year was dismal, as the Bills went 1–13 with minimal scoring. Shaw threw for 1,813 yards in 12 starts and 13 appearances, having 11 touchdowns and 26 interceptions (a league high) with a 51.2 completion percentage. For the following year, his fortunes improved slightly with the team. He started 13 of the 14 games in the 4-9-1 campaign, throwing for 1,666 yards while having 14 touchdowns and 17 interceptions for a 52.7 completion percentage. The 1973 season was his last with the team. They drafted Joe Ferguson prior to the season beginning, leading to a quarterback competition that Ferguson won. Shaw did not start any games that saw the Bills rise to 9–5 through a rushing attack from established back O.J. Simpson. Shaw had appearances in four games, throwing a total of 22-of-46 for 300 yards for four interceptions. In his career as a Bills starter, he went 8-27-2. Shaw was traded to the Cardinals for Ahmad Rashād. Between playing football, he did jobs such as insurance sales, business consultancy and carpet franchise supervision. He served as back-up on three teams until 1978. He served as assistant coach for Eastern Illinois in 1980, Chula Vista High School in 1981, Western Illinois in 1983 before being assistant coach/player with the Chicago Blitz of the United States Football League in 1984, although no job was longer than a year, owing to his desire to keep his family of four children in the area of San Diego. He applied to be coach at San Diego State in 1980, but he was denied, although he did call games on KSDO for the team in 1986 for a year. He was to be offensive coordinator of the San Diego Thunder of the World Indoor Football League in 1988, but the league folded before playing a down.