Here is a plausible heuristic. It has no guarantees of approximation factor, but might be useful in practice given the problem sizes you mentioned. Pick a threshold $\tau$, say $\tau=100$, chosen to balance running time vs quality of approximation. Execute the following algorithm:
Initialize $h$ to an empty hashmap (with a default that if you look up a nonexistent key, the lookup returns 0).
For each set $S \in C$ such that $|S| \le \tau$:
Optionally, delete all entries $x,y$ such that $h[x,y] \le \kappa$, for some constant $\kappa$ chosen to balance between running time vs approximately quality.
For each $S \in C$ such that $|S| > \tau$: (a)
For each $x \in S$:
Find all $y$ such that $y \in S$ and $h[x,y]>0$. (b)
For each such $y$, such that $y>x$:
- Set $h[x,y] := h[x,y] + 1$.
Output the pair $x,y$ such that $h[x,y]$ is maximized.
To improve the running time at the cost of reduced quality of approximation, you might be able to skip the loop marked (a).
There are many ways to implement the line marked (b):
You can iterate through all elements of $S$, and look them up in $h$. The running time will be linear in the size of $S$.
If you use an appropriate datastructure, you can implement the line (b) to run in time linear in the size of $S$ or $\{y \mid h[x,y]>0\}$, whichever is smaller. In particular, for each $x$, you can keep track of $\{y \mid h[x,y]>0\}$, sorted in order of increasing $y$. Then, you can merge those two sets using a standard merge-join, advancing the pointer where needed using binary search. This might be faster, especially if you delete entries of $h$ based on $\kappa$.