The 23-year-old Spaniard, seeded 14th, overcame two set points by Williams to win the first set against the 37-year-old American under the Centre Court roof at the All England Club in London.
After winning the first set, Muguruza rode the momentum without losing another game, breaking Williams' serve three times in the second set and clinching the victory after 77 minutes.
"I had the hardest match today against Venus," Muguruza said during her on-court interview as Williams watched. "She's such an incredible player. I grew up watching her play -- sorry.
"I feel incredible to be able to play her here. Of course I'm nervous because I always dreamed about winning it, but I was composed."
Williams, seeded No. 10 with five Wimbledon titles, was bidding to become the oldest woman in the Open era (since 1968) to win a Grand Slam title. She was playing in her ninth Wimbledon singles final, winning in 2000, 2001, 2005, 2007 and 2008. She has an overall singles record of 87-15 at Wimbledon.
"I only play against the Williams sisters. It's incredible," Muguruza said after the match. "I like it. It's the best final you can get -- Serena or Venus. And to play (Venus) here ... she has won five times, she's an expert. I don't know. Finally a Spanish girl can play on grass."
Muguruza is the second Spanish woman to win Wimbledon, joining her coach, Conchita Martinez, who beat a 37-year-old Martina Navratilova in 1994.
Williams was a point away twice from winning the opening set, ahead 5-4, while Muguruza served. Thereafter, Williams faltered, spraying her shots long, wide and into the net.
Williams, playing in her 20th Wimbledon, finished with 25 unforced errors -- 14 more than Muguruza.
"I miss Serena," Williams said afterwards, with her sister off the tour for the rest of this year because of her pregnancy. "I tried my best to do the things you do -- but I think there will be other opportunities."