I would assume that (seq_len, batch_size, hidden_dim) is just a design decision to reflect the focus on the time steps inherent to RNNs such as LSTMs or GRUs. For example, you can do output[-1] to get the output of the last step.
Usually, in my forward() method, I keep note of the shape after each processing step (in case of view() I even note why the reshaping is needed). This helps me a lot :). Checking the required input shapes and resulting output shapes is probably most frequently check in the PyTorch docs.