Well, that depends. If you look at table[i], how will you know if it is empty or not? If you use list**, then table[i] is type list*, and so you can easily tell if it is empty based on if it is null. If you use type list*, then table[i] is a list, and so unless you use a null, empty, or some other value for the key as a sentinel value indicating that the list is empty, then it will not work. So, yes, you could use list*, but then you need to add an additional sentinel condition, which might also limit which types of keys you allow. Alternatively, you could just ignore the first element of list[i], however, that would be wasteful. I should also point out that using list* instead of list** makes inserting an element at the front of table[i] harder; if you use a list** type, then you simply need to set the new entry's next pointer to the current value of table[i], and then assign to table[i] the address of the newly allocated entry. If you use type list*, you will need to insert the item between table[i] and table[i]->next, which makes the logic for insertion unnecessarily complicated.
Also, I should add that your hash table definition is flawed. A hash table is supposed to map one set of items to another. Your list structure has a single value. It needs both a key and a value. A better declaration for a hash table would be the following:
typedef struct HashTableEntry
{
char* key;
void* value;
struct HashTableEntry* next;
} HashTableEntry;
typedef struct HashTable
{
HashTableEntry** entries;
int capacity; // size of entries
int length; // number of key/value pairs currently in map
} HashTable;