I found the answer to my first question here.

My issue was that my associated data was fetched with the name wordBox
but GRDB was looking for fetched data named header because it is the name of the variable I defined in my CardWithHeader struct.

To fix this, I had to change the name of the array of associated data that was fetched from wordBox to header which I did like so, by adding the forKey method to set the name of the fetched data to header:

var request = Card
    .including(required: Card.header.forKey("header"))
    .asRequest(of: CardWithHeader.self)
    .order(Card.Columns.id.desc)
    .limit(limit, offset: offset)

This now gives me clues to solve my second question.
I will post here if I manage to solve it.