I've also tried to fool refresh into thinking citationKey is a native field, and it does add a row, but it's half-height, and doesn't display the value:
$patch$(itemBoxInstance.__proto__, 'refresh', original => function() {
const fieldOrder: string[] = this._fieldOrder
if (!fieldOrder.length) {
const fieldNames: string[] = []
if (!this.showTypeMenu) {
fieldNames.push('itemType')
}
fieldNames.push('citationKey')
const fields = Zotero.ItemFields.getItemTypeFields(this.item.getField('itemTypeID'))
for (const id of fields) {
fieldNames.push(Zotero.ItemFields.getName(id))
}
if (this.item instanceof Zotero.FeedItem) {
const row = Zotero.getActiveZoteroPane().getCollectionTreeRow()
if (row && row.isFeeds()) {
fieldNames.unshift('feed')
}
}
else {
fieldNames.push('dateAdded', 'dateModified')
}
this._fieldOrder = fieldNames
}
// eslint-disable-next-line prefer-rest-params
original.apply(this, arguments)
this._fieldOrder = fieldOrder
})