Answering my own question: flattening the df like this gives the desired outcome:
object_1df = pd.DataFrame([['a', 1], ['b', 2]],
columns=['letter', 'number'])
object_2df = pd.DataFrame([['b', 3, 'cat'], ['c', 4, 'dog']],
columns=['letter', 'number', 'animal'])
objects = [object_1df, object_2df]
catalog = pd.DataFrame()
for df in objects:
df.set_index('letter', inplace=True)
flattened_data = {f'{index}_{col}': df.loc[index, col] for index in df.index for col in df.columns}
flattened_df = pd.DataFrame([flattened_data])
display(flattened_df)
catalog = pd.concat([catalog, flattened_df], ignore_index=True)
display(catalog)