The Dupligroups or Collection Instance workflow in Blender are indeed a bit unorthodox, and somewhat different from other applications (like so many other things in Blender), but not any less capable.
The gist of it is that in Blender group definition and group usage are two separate and distinct procedures all together. This means you can't directly edit an instance of a group/collection, nor can you generally define a group directly from its constituting parts at target location.
Dupligroups or (Collection Instances for 2.8+) are a way of creating bundles of independent objects that are grouped together and can then be deployed as a single object or stored as a library for later reuse. In most ways similar to AutoCAD Blocks, Sketchup Components, or 3DsMax Groups.
Unlike most other programs however, group definition and group use are completely separate in Blender, that means you define a group with a set of included objects but they aren't 'converted' into an instance of that group, nor is a group directly created from them at present location. They always remain as a separate editable "originals" you can go back to to modify, but never directly use nor actively participate in your actual scene.
In much the same way an instance of that group is generally an independent object chosen specifically as duplicator that generally has no other geometric data or geometry associated with. The group/collection instance is also not editable, merely a dummy used to mirror what was defined above.
- In a work file (or even a separate 'library' file if you wish to reuse them later or in different files or across projects) I usually create a new separate scene exclusively for "group definition" where I create your "group originals". In 2.8+ with the advent of Collections, you can simply create a separate "master collection" (called "Instances" for example) inside which you will place all your "originals" and define your groups or components. In your particular case that would be where you would place the window frames.
Those objects can then be grouped (with Ctrl+G for 2.7# or moved into individual sub-collections with M) and they can belong to several distinct groups/collections at once even (say one same window with a handle other with hinges and all possible combinations).
Each group/collection has by default it's own origin at the scene's center (coordinate $0,0,0$) but this can be adjusted to accommodate several group definitions in the same scene but keep their individual origins in a convenient place relative to their participating objects. If you go to the Properties Window > Object Tab > Groups (Collections for 2.8+) you can set a different origin for each group (use the option Set offset from Cursor for easier adjustment).
- You can also create nested groups, or groups instances inside groups
if you wish to have several modular reusable components that are
repeated and combined often in different ways.
Adding instances to a scene
In your actual work scene where you want to use your group instances just access the add menu Shift+A and choose your group from the last menu entry Group Instance. This will list all available instances (both local and linked) in a searchable menu.
Group instances are generally used from an Empty type of object by default that doesn't have any mesh data or geometry of it's own. Only exception is if you want to create a non renderable dummy geometry as helper object for snapping or correctly placing the dupligroup in a scene. For 2.8 this is mandatory, instancing from other object types has been deprecated.
Adding objects to existing groups
- Select all newly added objects you want to add to an existing group,
then Shit-select an object already in the desired group,
making sure both remain selected, but the object already in the
group remains the active one.
- Then press Ctrl + L > Groups to match the
groups from active to all selected objects.
Advantages and Disadvantages
By keeping group definition and group use separate you gain some and you loose some.
You can't edit instances in place.
You can't really add an object to a group directly through it's
instance, you always have to go back to the original and do it there; changes propagate automatically to all instances.
You do avoid trouble with object offsets, since they were safely
preserved and well defined at source.
Editing in cluttered scenes can be made easier by separating the two actions.
Same objects can participate in any number of groups/collections
saving some resources.
Creating groups with similar features or variations is made more
modular and less repetitive.