Giovanni Simeone, the 21-year-old son of Atletico Madrid coach Diego, scored twice in the first 15 minutes before Alex Sandro put through his own goal on a miserable afternoon for the Turin side.
Miralem Pjanic pulled one back for the titleholders when he curled in a free kick in the 82nd minute.
It was the first time since October 2005 that Juventus had conceded three goals in the first half of a Serie A match. Juve's third league defeat of the season meant their lead at the top was cut to four points over AC Milan who won 4-1 at Empoli on Saturday.
Genoa, ninth in the table with 19 points, went ahead with an extraordinary goal after just three minutes.
Juventus defender Leonardo Bonucci lost possession and Luca Rigoni sprinted clear. His shot was parried by Gianluigi Buffon, who also saved the rebound from Lucas Ocampos and then another effort from Simeone before the Argentine forward scored at the fourth attempt.
Ten minutes later, a flowing move found Darko Lazovic on the right and he turned Alex Sandro inside out before delivering a low cross which Simeone met with a diving header to score the second.
Genoa, who had already beaten Milan by the same score at the Luigi Ferraris stadium looked dangerous every time they came forward and scored a third in the 28th minute after more chaos in the Juventus defence.
A corner found Rigone who volleyed against the crossbar and Alex Sandro, in attempting to clear, only succeeded in heading it over the line. Shortly afterwards, Juventus defender Leonardo Bonucci went off with what appeared to be a hamstring injury.
Juve pulled themselves together after halftime and brought on striker Gonzalo Higuain but were only able to make a small dent in Genoa's lead with Pjanic's late goal.
Lazio and Atalanta both won to move onto 28 points, one behind Milan.
Sergej Milinkovic-Savic tapped in Dusan Basta's cross from close range to give Lazio a 1-0 win at Palermo and hand the Sicilians a seventh straight defeat.
Andrea Masiello and Jasmin Kurtic scored in each half to give Atalanta a 2-0 win at Bologna, their sixth win in a row.
Palermo are now level at the bottom on six points with Crotone who drew 1-1 with Sampdoria.
Marco Sau scored with a back-heel flick to give Cagliari a 2-1 win over Udinese in the afternoon's other match.