Well… I think it’s important to break down some things because an inventory is just a menu. Items that spawn in world are actors, plain and simple.
All spawnable objects are Actors. If you can control them say like a vehicle, then a pawn makes sense. A pawn is just an actor that can be “possessed” and characters are an extension of the pawn, but have animations like walking, etc. Granted, you can animate a pawn without it being a character. It just requires extra steps. A key thing to note here is that all Actors are replicatable on the network.
Another type of object in Unreal is the UObject. All actors are UObjects. This is basically as low as you can go on the hierarchy. Just like a class is a struct with more features, a UObject is Unreal’s version of a class with some fancy Unreal-specific features. UObjects are pretty light weight so they are good for things in menus. Unlike Actors, UObjects are not replicated over the network. You can make them do so with some extra work though.
Reuben Ward has a great tutorial series for a multiplayer survival game that involves making an inventory system out of UObjects: https://www.patreon.com/reubenward
Personally, I make my inventories out of widgets because the inventory is just a menu that shows images or icons of an object that you can click/drag, etc. When I want to spawn the object or drop it into the world, I delete the widget from the menu and spawn the actor version of it. You can use buttons if you like, but I find buttons to be a bit heavy. I can make the basic user widget clickable/hoverable/draggable if I need to.
When I want to add something to the inventory it’s the reverse. There is an actor in the world that is designated as a pickup item class. When the player steps on it or interacts with it, that Actor is deleted and a widget version of it is added to the inventory. I show how to do this in my “Not Mine Craft” tutorial series: UE4 - Not Mine Craft - YouTube
When it comes to arrays, structs, lists, and slots, they’re kind of all the same thing. An array is just a list of a single type. A struct is an array of multiple types. And a list is just an array with some added features for iteration, adding/removing items, etc. They can still only hold one type as far as I know. But if all your types are of the class “item” then it doesn’t matter. That said, the TArray data type is Unreal’s version of an array which basically does what lists were supposed to do, with almost all the same functionality. You can read about how each works here:
UStructs: Structs, USTRUCTS(), They're Awesome - UE4: Guidebook
TArrays: TArray: Arrays in Unreal Engine | Unreal Engine 4.27 Documentation
Lists: List | Unreal Engine Documentation
I tend to use arrays and structs because I am more familiar with them and like I said, TArrays offer many of the same advantages as List do but are lighter from what I gather. All of my inventories are slot-based. I use structs to define the property of each item displayed and those items are added to an array that is used to populate the slots. The slots are just widgets. If only Unreal made it easy to access the children of the slots, (we) wouldn’t need to store then in an array. Kind of redundant in my opinion.
At the end of the day, it really just depends on what you want out of your inventory and how you want to manage the data. I really like the UObject approach. I might use that on my next project.