Winn was born in Los Angeles and attended San Ramon Valley High School. He attended college at Santa Clara University, and played baseball and basketball (where he played guard alongside former roommate and future NBA Most Valuable Player Steve Nash).
Winn was selected in the third round (65th overall) of the 1995 MLB amateur draft by the Florida Marlins. He was taken by the Tampa Bay Devil Rays in the 1997 MLB expansion draft.
Winn made his major league debut on May 11, 1998 as a pinch runner for the Tampa Bay Devil Rays. On October 3, 1999, he hit an inside-the-park grand slam against the New York Yankees. Winn represented Tampa Bay in the 2002 All-Star Game.
On 29 October 2002, he was traded to the Seattle Mariners as compensation for Lou Piniella being hired to manage the Devil Rays. Five days later, Winn married his college sweetheart, Blessings Robertson.
Winn recorded 462 hits, 40 home runs, 56 stolen bases, 96 doubles, 17 triples, and a .299 batting average over a 2½ year period.
Prior to the trading deadline on July 31, 2005, Seattle traded Winn to the Giants for catcher Yorvit Torrealba and minor league pitcher Jesse Foppert. Despite a late-season rally, the 2005 Giants finished third in the NL West, with a 75-87 record. In his 231 at bats as a Giant, Winn had a .359 batting average, a .680 slugging percentage, 26 RBI, and hit 14 home runs. By comparison, in his 386 at bats with the Mariners that year, Winn was batting .275, slugging .391, had 37 RBIs, and hit 6 home runs.
In his two months with the Giants, Winn equaled his career best for home runs in a season. For his performance in the month of September, Winn was named National League Player of the Month; he recorded 51 hits and had a batting average of .447. Winn's 51 hits were the most in one month by a Giant in over 30 years. Winn had a career-high hitting streak of 20 games. He signed a three-year, $23.25M contract extension with the Giants the following offseason.
In 2006 Winn played in 149 games making 635 plate appearances and saw his average, OBP and slugging drop to .262/.324/.396.
In 2007 Winn played in 155 games making 653 plate appearances and saw his average, OBP and slugging rebound closer to his career averages .300/.353/.455.
In 2008, Winn repeated his 155 games and made 667 plate appearances. His average, OBP and slugging were .306/.363/.426.
In 149 games in 2009, Winn made 597 plate appearances while averaging .262, getting on base .318 and slugging .353. He hit just two home runs and his slugging declined for three straight years. He did record his 200th stolen base and 500th walk during that year. Winn became a free agent following the season
On February 8, 2010, Winn signed a one-year deal with the New York Yankees. On May 28, he was designated for assignment as Curtis Granderson was activated from the disabled list. On May 28, 2010, he was officially released by the Yankees. He signed with the St. Louis Cardinals on June 5, and finished the season with them, becoming a free agent at the end of the season.
Winn signed a minor league contract with the Baltimore Orioles on February 3, 2011. Four days after his request for an unconditional release was granted on March 28, he announced his retirement as an active player on April 1.
He appeared on the ballot for the National Baseball Hall of Fame and Museum 2016 election and earned zero votes.