Here's how I think of it, which has been working for me:
matrix - If you have data that would make sense to be in a spreadsheet-type format and all your data are numbers.
dataframe - If you have data that would make sense to be in a spreadsheet-type format and some columns are numbers but other columns are something else (character strings, dates, TRUE/FALSE); but each column is only one thing. That is, you have one column that's all dates, another column that's all numbers, yet another column that's all character strings, etc.
list - if you need to mix data types within a certain entity (vector or column of data).
matrix - If you have data that would make sense to be in a spreadsheet-type format and all your data are numbers.
dataframe - If you have data that would make sense to be in a spreadsheet-type format and some columns are numbers but other columns are something else (character strings, dates, TRUE/FALSE); but each column is only one thing. That is, you have one column that's all dates, another column that's all numbers, yet another column that's all character strings, etc.
list - if you need to mix data types within a certain entity (vector or column of data).