Certainly! Below is a Python function that generates test cases for the "League Standings Score Sheet" problem statement:

```python
import random
import string

def random_team_name():
    length = random.randint(1, 20)
    return ''.join(random.choices(string.ascii_letters, k=length))

def tcgen():
    datasets = []
    
    # Generate a random number of datasets (up to 50)
    num_datasets = random.randint(1, 50)
    
    for _ in range(num_datasets):
        # Number of teams (n) for this dataset
        n = random.randint(1, 10)
        
        # Generate information for each team
        teams = []
        for _ in range(n):
            name = random_team_name()
            w = random.randint(0, 9)
            l = random.randint(0, 9)
            d = random.randint(0, 9)
            teams.append(f"{name} {w} {l} {d}")
        
        # Append dataset to the datasets list
        datasets.append(f"{n}\n" + "\n".join(teams))
    
    # Append the terminating 0 to indicate the end of input
    datasets.append("0")
    
    return "\n\n".join(datasets)

# Example usage:
print(tcgen())
```

### Explanation:

1. **Function `random_team_name`**: Generates a random team name with a length between 1 and 20 characters. The name consists of random uppercase and lowercase letters.

2. **Function `tcgen`**:
   - Generates a random number of datasets (up to 50).
   - For each dataset:
     - Generates a random number of teams (n) between 1 and 10.
     - For each team, it generates a random name and random values for wins (w), losses (l), and draws (d) between 0 and 9.
     - Constructs a string representation of the dataset.
   - Appends all datasets to the `datasets` list.
   - Adds the terminating "0" to indicate the end of input.
   - Joins all datasets with double newlines separating them and returns the final string.

This generator ensures that the test cases are varied and cover different scenarios, making it useful for testing the robustness of your solution to the problem.