The solution requires 3 Views, which I will describe here. You should develop these in order, so that View 1 is functioning correctly first, then move on to View 2, then View 3. The process is a bit convoluted, as is the implementation, so it's best to give the Views names like View 1, View 2 and View 3 at least temporarily during development. My comments here will be easier to follow this way. You can rename the Views later without causing any problems, just be aware that if you change the View slugs later you need to update all the View shortcodes throughout the code to match the new slugs.
To get started, open the Character Content Template in one tab and open one of the Character posts on the front-end of the site in another tab. I suggest choosing a Character that has a relatively high number of related Photographs and Photoshoots. Then begin creating View 1 in a new tab so you can jump between tabs easily during development.
View 1
Create a new View in the legacy editor. In the first popup, choose the option "Display all the results" and name it View 1. In the main editor, choose (only) the Photograph post type in Content Selection. In the Query Filter section, add a Post Relationship or Repeatable Field Group Owner filter, choose the Photographs - Characters relationship, and choose the configuration ..."as related items of the post where this View is shown". Scroll down to the Loop Output section and click the Loop Wizard button. Choose the loop style "List with separators" then click "Add field", add the post title (for testing purposes), and click Finish. You will see the loop template generated automatically like this:
[wpv-layout-start]
[wpv-items-found]
<!-- wpv-loop-start -->
<wpv-loop>
[wpv-item index=other]
[wpv-post-title],
[wpv-item index=last]
[wpv-post-title]
</wpv-loop>
<!-- wpv-loop-end -->
[/wpv-items-found]
[wpv-no-items-found]
<strong>[wpml-string context="wpv-views"]No items found[/wpml-string]</strong>
[/wpv-no-items-found]
[wpv-layout-end]
Delete everything inside the wpv-no-items-found shortcode, like so:
[wpv-no-items-found][/wpv-no-items-found]
Now place this View in the Content Template for Characters using a custom HTML block. Use a wpv-view shortcode with the attribute cached="off":
View 1:<br />
[wpv-view name="view-1" cached="off"]
Reload the Character post and now you should see a comma-separated list of the related Photograph post titles appear. The post titles are for testing purposes, we will remove them later. If the list shows the correct related Photographs, you're ready to move to the next View. I suggest a new tab for this.
View 2
Create another new View. In the first popup, choose the option "Display all the results" and name it View 2. In the main editor Content Selection area, choose the radio option "Taxonomy" and select "Photoshoot". Scroll down to the Query Filter panel, add a filter for taxonomy term, and choose the configuration ..."set by the current post". Scroll down to the Loop Output editor and run the Loop Wizard again, choose "List with separators" again, but this time insert the Taxonomy title. Finish, and you will see the loop template generated automatically again, like this:
[wpv-layout-start]
[wpv-items-found]
<!-- wpv-loop-start -->
<wpv-loop>
[wpv-item index=other]
[wpv-taxonomy-title],
[wpv-item index=last]
[wpv-taxonomy-title]
</wpv-loop>
<!-- wpv-loop-end -->
[/wpv-items-found]
[wpv-no-items-found]
<strong>[wpml-string context="wpv-views"]No items found[/wpml-string]</strong>
[/wpv-no-items-found]
[wpv-layout-end]
Delete everything inside the wpv-no-items-found shortcode again. Instead of adding View 2 to the template, edit View 1 and replace the wpv-post-title shortcodes with a shortcode for View 2, caching turned off:
[wpv-layout-start]
[wpv-items-found]
<!-- wpv-loop-start -->
<wpv-loop>
[wpv-item index=other]
[wpv-view name="view-2" cached="off"],
[wpv-item index=last]
[wpv-view name="view-2" cached="off"]
</wpv-loop>
<!-- wpv-loop-end -->
[/wpv-items-found]
[wpv-no-items-found][/wpv-no-items-found]
[wpv-layout-end]
Reload the Character post on the front-end of the site. You should see a comma-separated list of term titles. These should be the terms assigned to all Photograph posts related to the Character. You might notice that the list includes repeated terms, perhaps also some commas that seem unnecessary, and a somewhat random sort order. We need one more View to fix those issues. The best way to handle this is to use another View of terms filtered by term ID set by a shortcode attribute. This type of filter will help consolidate the terms from all the different Photographs in a way that is easily sorted, while ignoring the duplicates and extra commas. Those issues aside, if the list shows the terms you expect, you're ready to move on to the next View. I suggest a new tab. Create a clone of View 2 from Toolset > Views. Hover over the title, click the Duplicate link, and call it View 3 for now. Before you begin editing View 3, edit View 2 again and replace the term title shortcodes with term ID shortcodes:
[wpv-layout-start]
[wpv-items-found]
<!-- wpv-loop-start -->
<wpv-loop>
[wpv-item index=other]
[wpv-taxonomy-id],
[wpv-item index=last]
[wpv-taxonomy-id]
</wpv-loop>
<!-- wpv-loop-end -->
[/wpv-items-found]
[wpv-no-items-found][/wpv-no-items-found]
[wpv-layout-end]
View 3
Edit the new cloned View 3 and edit the existing term Query Filter. Change it to "Terms with ID set by the shortcode attribute: terms". Scroll down to the Loop Editor and click "Loop Wizard". This is the View where you ultimately set the design for the final output of the terms list, so choose the loop style you want and insert the fields you want to display for each term. If you choose the option to use a Content Template in the loop, you can use the Block Editor to design the loop template if you prefer.
Place View 3 directly in the Character Content Template using wpv-view with caching turned off. Add the "terms" shortcode attribute and insert some hard-coded Photoshoot term IDs for testing purposes, like this:
View 3 test with hardcoded ids:<br />
[wpv-view name="view-3" terms="123,456" cached="off"]
Replace 123,456 with commas separating the IDs of at least two known Photoshoot taxonomy terms. You can find term IDs in the URL of the page where you would normally edit the term in wp-admin. So go to Photograph > Photoshoot, click a term name, and look for the tag_id parameter in the URL. The value of tag_id is the term ID you need. Repeat that process to get at least two term IDs and place them in the View shortcode term attribute like shown in the previous code example. Reload the Character page and you should see the View 3 test text, followed by a term list displayed using the styles you added in the View so far. The design does not have to be perfect now, it's for a proof of concept.
Once that is showing up as expected, you're ready to combine all 3 Views. Add to the Content Template:
Nested Views:
[wpv-view name="view-3" terms="[wpv-view name='view-1' cached='off']" cached="off"],
You have nested the results of View 2 inside the loop of View 1, which is itself nested in the terms attribute of View 3. The result on the front-end should be a list of terms associated with the Photograph posts related to the Character currently being displayed.
Hope this helps, I will stand by for your updates and I can help if you get stuck or have questions about the setup. I will most likely need a login to jump into wp-admin if you need help, so I am activating private reply fields here.