Phillipe nailed it. The gradient fill needs to be inside the same group as your shape path.
When you create a gradient fill from scratch, it’s placed in the shape layer hierarchy depending on what is selected. So say you create a shape layer with the ellipse tool. You’d have by default the following:
>Contents
>>Ellipse 1
>>>Ellipse Path 1
>>>Stroke 1
>>>Fill 1
>>>Transform: Ellipse 1
Here’s the tricky part. Say you go to add a gradient fill or stroke to this. If you have the “Ellipse 1” group (or anything inside it) selected, it will be created inside said group. In this case, you’ll be able to see the gradient handles. No problem. However, if you happen to have “Contents” or a different layer or nothing selected, the gradient will be created outside of the “Ellipse 1” group and the handles will be invisible. Super tricky! To fix, just drag the gradient inside the “Ellipse 1” hierarchy and you’ll be good to go.
This seems like a bug/oversight on Adobe’s part. Would love to see this behave differently in the future.