Getting contents pages in Crystal Reports is pretty nasty, basically because you want to know first what you don't know until last (what page number N group X is on). see, you may get 10 pages in with 20 groups, and your hypothetical contents page has 20 lines. Suddenly you reach group 21, and the contents needs two pages, thus making all the previous page entries out by one. Repeat as the report grows or groups expand, etc.
The first, simplest method assumes that you don't mind that the contents page actually appears after the rest of the report. In this scenario, you use variables to build up a string or arrays containing the page/group information, then process it all in the Report Footer.
The second involves allowing Crystal to update a table in the database, and also requires refreshing the report twice to get the correct page numbers.
This link has some details on both methods.